package com.jsy.canal.listener;


import com.alibaba.otter.canal.protocol.CanalEntry;
import com.xpand.starter.canal.annotation.DeleteListenPoint;
import com.xpand.starter.canal.annotation.InsertListenPoint;
import com.xpand.starter.canal.annotation.ListenPoint;
import com.xpand.starter.canal.annotation.UpdateListenPoint;

//@CanalEventListener //注释掉，避免监听到太多数据
public class CanalDataEventListener {

    /**
     * 监听插入事件
     * @param eventType 事件类型
     * @param rowData 插入的那行数据
     */
    @InsertListenPoint
    public void onEvent(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
        System.out.println("eventType = " + eventType);
        rowData.getAfterColumnsList().forEach((c) -> System.err.println("By--Annotation: " + c.getName() + " ::   " + c.getValue()));
    }

    /**
     * 监听更新事件
     * @param eventType 事件类型
     * @param rowData 数据（包含更新前后的那行数据）
     */
    @UpdateListenPoint
    public void onEvent1(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
        System.out.println("eventType = " + eventType);
        System.out.println("修改之前的数据--------------------");
        rowData.getBeforeColumnsList().forEach((c) -> System.err.println("By--Annotation: " + c.getName() + " ::   " + c.getValue()));
        System.out.println("修改之后的数据--------------------");
        rowData.getAfterColumnsList().forEach((c) -> System.err.println("By--Annotation: " + c.getName() + " ::   " + c.getValue()));
    }

    /**
     * 监听删除事件
     * @param eventType 事件类型
     * @param rowData 删除的那行数据
     */
    @DeleteListenPoint
    public void onEvent3(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
        System.out.println("eventType = " + eventType);
        System.out.println("删除之前的数据--------------------");
        rowData.getBeforeColumnsList().forEach((c) -> System.err.println("By--Annotation: " + c.getName() + " ::   " + c.getValue()));
    }

    /**
     * 自定义监听
     * destination 安装canal的时候指定名字；一般是example
     * schema 数据库
     * table 表
     * eventType 事件类型；新增、修改、删除
     * @param eventType 事件类型；新增、修改、删除
     * @param rowData 行数据
     */
    @ListenPoint(destination = "example", schema = "changgou_content", table = {"tb_content_category"},
            eventType = {CanalEntry.EventType.UPDATE})
    public void onEvent4(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
        System.out.println("eventType = " + eventType);
        rowData.getAfterColumnsList().forEach((c) -> System.err.println("By--Annotation: " + c.getName() + " ::   " + c.getValue()));
    }
}